本文共 3155 字,大约阅读时间需要 10 分钟。
界面设计分为预览和回放两个模块,本节主要是预览模块。
一、替换系统图标
1. 替换生成程序图标
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210514225452103.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA5MzExOA==,size_16,color_FFFFFF,t_70)
2. 替换生成界面图标
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210514225536731.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTA5MzExOA==,size_16,color_FFFFFF,t_70)
二、窗口布局
1. 自定义标题栏图像
QWidget来实现自定义标题栏,因为QWidget可以自定义大小。布局器使用代码。
自定义标题栏
添加组件,并改变样式
定义标题栏最小化、最大化、关闭功能键
2. 窗口布局
#include
#include
/*创建布局器*/auto Vlay = new QVBoxLayout();this.setLayout(Vlay);Vlay->setContentsMargins(0, 0, 0, 0); //边缘间隔Vlay->setSpacing(0);
//内部对象的间隔Vlay->addWidget(ui.head); //布局器添加布局的对象Vlay->addWidget(ui.body);auto Hlay = new QHBoxLayout;ui.body->setLayout(Hlay);Hlay->addWidget(ui.left);Hlay->addWidget(ui.cams);Hlay->setContentsMargins(0, 0, 0, 0);
三、拖动和缩放
1. 拖动功能
QT自带标题栏是可以实现拖动效果的,但自定义标题栏就需要自己实现拖动效果
static bool MousePress = false;//鼠标是否按下static QPoint MousePoint;//点击的位置void XViewer10::mousePressEvent(QMouseEvent* ev){
MousePress = true;//记录按下的状态MousePoint = ev->pos();//记录鼠标的位置}void XViewer10::mouseReleaseEvent(QMouseEvent* ev){
MousePress = false;//记录鼠标的状态}void XViewer10::mouseMoveEvent(QMouseEvent* ev){
//若鼠标未按下if (!MousePress){
QWidget::mouseMoveEvent(ev);//执行其本来的时间return;}this->move(ev->globalPos() - MousePoint);//当前点击点与窗口初始位置根据相对位置来移动}
2. 最大化和最小化
定义槽函数
//最大化窗口槽函数void XViewer10::MaxWindow(){
ui.max->setVisible(false); //最大化图标不可见ui.normal->setVisible(true);//普通图标可见this->showMaximized(); //当前窗口最大化}void XViewer10::NormalWindow(){
ui.normal->setVisible(false); ui.max->setVisible(true); this->showNormal(); }
绑定信号和槽
四、右键菜单调整预览窗口
1. 右键菜单显示窗口数量
定义右键的菜单,并添加菜单的选项
//定义一个菜单QMenu left_menu;auto m = left_menu.addMenu(C("视图"));//给菜单添加一个菜单auto a = m->addAction(C("1视图")); //给菜单添加一个选项connect(a, SIGNAL(triggered()), this, SLOT(view1()));//定义点击选项后的槽函数a = m->addAction(C("4视图"));connect(a, SIGNAL(triggered()), this, SLOT(view4()));a = m->addAction(C("9视图"));connect(a, SIGNAL(triggered()), this, SLOT(view9()));a = m->addAction(C("16视图"));connect(a, SIGNAL(triggered()), this, SLOT(view16()));
重载右键的处理事件
//当点击右键后会执行以下处理void XViewer10::contextMenuEvent(QContextMenuEvent* ev){
//将鼠标的位置交给菜单处理,菜单会在鼠标的位置显示出来//菜单具体的处理取决于left_menu内部的实现left_menu.exec(QCurser::pos());ev.accpet();//事件处理结束}
2. 预览窗口的显示
static QWidget *cam_wids[16] = {
nullptr };//定义存储窗口的仓库void XViewer10::view(int count){
//初始化布局器auto GLay = ui.cams->layout();if(!GLay){
GLay = new QGridLayout();GLay.setContentMargins(0, 0, 0, 0);GLay.setSpacing(5);ui.cams->setLayout(GLay);}//根据传入的窗口数量添加显示的窗口int col = sqrt(count);//获取列数for(int i = 0; i setStyleSheet("background-color: rgb(0, 0, 0);");}//添加到布局器GLay.addWidget(cam_wids[i], i / col, i % col);}//根据当前的视图数量,清除无效的窗口for(int i = count; i |